package com.thread.threadfirst.javaBase.java8;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * JDK 1.8 新增加的函数接口：
 * java.util.function
 * java.util.function 它包含了很多类，用来支持 Java的函数式编程
 *
 * Predicate <T> 接口是一个函数式接口，它接受一个输入参数 T，返回一个布尔值结果。
 * 该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑（比如：与，或，非）。
 * 该接口用于测试对象是 true 或 false。
 *
 * 我们可以通过以下实例来了解函数式接口 Predicate <T> 的使用
 */
public class FunctionalInterfaceTest {


    public static void main(String[] args) {
        List<Integer> list= Arrays.asList(1,2,3,4,5,6,7,8,9);

        // Predicate<Integer> predicate = n -> true
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // n 如果存在则 test 方法返回 true

        System.out.println("输出所有数据:");
        compare(list,n->n!=0);

        // Predicate<Integer> predicate1 = n -> n%2 == 0
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // 如果 n%2 为 0 test 方法返回 true

        System.out.println("\n输出所有偶数:");
        compare(list,n->n%2==0);


        // Predicate<Integer> predicate2 = n -> n > 3
        // n 是一个参数传递到 Predicate 接口的 test 方法
        // 如果 n 大于 3 test 方法返回 true

        System.out.println("\n输出大于 3 的所有数字:");
        compare(list,n->n>3);

    }

    public static void compare(List<Integer> list,Predicate<Integer> predicate){
        for (Integer integer : list) {
            if (predicate.test(integer)) {
                System.out.print(integer+" ");
            }
        }
    }
}
